package pe.gob.mininter.dirandro.vaadin.panel.configuracion;

import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Parametro;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.ParametroService;
import pe.gob.mininter.dirandro.service.ValorService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.ValidateLimit;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class PanelConfigParametro extends DirandroComponent implements TextChangeListener, ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private VerticalLayout pnlPrincipal;

	@AutoGenerated
	private HorizontalLayout pnlContenidoLayout;

	@AutoGenerated
	private VerticalLayout pnlParametroContenido;

	@AutoGenerated
	private HorizontalLayout pnlBotonContenido;

	@AutoGenerated
	private Button btnEliminarParametro;

	@AutoGenerated
	private Button btnGestionParametro;

	@AutoGenerated
	private ComboBox cmbEstado;

	@AutoGenerated
	private TextField txtValor;

	@AutoGenerated
	private TextArea txtADescripcion;

	@AutoGenerated
	private TextField txtNombre;

	@AutoGenerated
	private TextField txtCodigo;

	@AutoGenerated
	private Label lblParametro;

	@AutoGenerated
	private VerticalLayout pnlTablaContenido;

	@AutoGenerated
	private VerticalLayout pnlTabla;

	@AutoGenerated
	private Table tblParametro;

	@AutoGenerated
	private HorizontalLayout pnlFiltroTabla;

	@AutoGenerated
	private TextField txtFiltroEstado;

	@AutoGenerated
	private TextField txtFiltroValor;

	@AutoGenerated
	private TextField txtFiltroNombre;

	@AutoGenerated
	private TextField txtFiltroCodigo;

	@AutoGenerated
	private Label lblFiltroBusqueda;

	private static final long serialVersionUID = -5744214819591057526L;
		
	private ValorService valorService;
	
	private ParametroService parametroService;
	
	private boolean flagNuevo;
	
	private List<Valor> estados;
	
	private String codigo;

	public PanelConfigParametro(List<Opcion> acciones, String height) {
		super(acciones, height);
		buildMainLayout();
		setCompositionRoot(mainLayout);

		valorService = Injector.obtenerServicio(ValorService.class);
		parametroService = Injector.obtenerServicio(ParametroService.class);
		postConstruct();
		debugId();
	}

	private void debugId(){
		mainLayout.setDebugId("mainLayout");
		pnlPrincipal.setDebugId("pnlPrincipal");
		pnlContenidoLayout.setDebugId("pnlContenidoLayout");
		pnlParametroContenido.setDebugId("pnlParametroContenido");
		pnlBotonContenido.setDebugId("pnlBotonContenido");
		btnEliminarParametro.setDebugId("btnEliminarParametro");
		btnGestionParametro.setDebugId("btnGestionParametro");
		cmbEstado.setDebugId("cmbEstado");
		txtValor.setDebugId("txtValor");
		txtADescripcion.setDebugId("txtADescripcion");
		txtNombre.setDebugId("txtNombre");
		txtCodigo.setDebugId("txtCodigo");
		lblParametro.setDebugId("lblParametro");
		pnlTablaContenido.setDebugId("pnlTablaContenido");
		pnlTabla.setDebugId("pnlTabla");
		tblParametro.setDebugId("tblParametro");
		pnlFiltroTabla.setDebugId("pnlFiltroTabla");
		txtFiltroEstado.setDebugId("txtFiltroEstado");
		txtFiltroValor.setDebugId("txtFiltroValor");
		txtFiltroNombre.setDebugId("txtFiltroNombre");
		txtFiltroCodigo.setDebugId("txtFiltroCodigo");
	}

	public void postConstruct() {
		habilitarEdicion(false);
		List<Parametro> parametros = parametroService.buscar(null);
		cargarParametros(parametros, true);
		
		tblParametro.setSelectable(true);
		tblParametro.setImmediate(true);
		tblParametro.setNullSelectionAllowed(true);
		tblParametro.setNullSelectionItemId(null);
		txtADescripcion.setNullRepresentation("");
		
		tblParametro.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 7962790507398071986L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblParametro.getValue() == null;
				if(esModoNuevo){
					tblParametro.setValue(null);
					habilitarEdicion(!esModoNuevo);
					limpiar();
				}
				else{
					Item item = tblParametro.getItem(tblParametro.getValue());
					codigo=(String)item.getItemProperty("codigo").getValue();
					txtCodigo.setValue(item.getItemProperty("codigo").getValue());
					txtNombre.setValue(item.getItemProperty("nombre").getValue());
					txtADescripcion.setValue(item.getItemProperty("descripcion").getValue());
					txtValor.setValue(item.getItemProperty("valor").getValue());
					
					String estadoSel=(String)item.getItemProperty("estado.nombre").getValue();

					for (Valor estado : estados) {
						if(estado.getNombre().equals(estadoSel)){
							cmbEstado.select(estado);
							break;
						}
					}
					habilitarEdicion(!esModoNuevo);
				}
			}
		});
		
		cmbEstado.setInputPrompt("Estado");				
		estados = valorService.obtenerLista(Constante.LISTA.CODIGO.ESTADO);		
		BeanItemContainer<Valor> bicEstados = new BeanItemContainer<Valor>(Valor.class,  estados);		
		cmbEstado.setContainerDataSource(bicEstados);		
		cmbEstado.setItemCaptionPropertyId("nombre");
		
		txtFiltroCodigo.setImmediate(true);
		txtFiltroNombre.setImmediate(true);
		txtFiltroValor.setImmediate(true);
		txtFiltroEstado.setImmediate(true);
		
		txtFiltroCodigo.addListener((TextChangeListener)this);
		txtFiltroNombre.addListener((TextChangeListener)this);
		txtFiltroValor.addListener((TextChangeListener)this);
		txtFiltroEstado.addListener((TextChangeListener)this);
		
		btnGestionParametro.addListener((ClickListener)this);
		btnEliminarParametro.addListener((ClickListener)this);
		
		txtADescripcion.addListener(new ValidateLimit(txtADescripcion, 250));
		txtCodigo.addListener(new ValidateLimit(txtCodigo, 15));
		txtNombre.addListener(new ValidateLimit(txtNombre, 90));
		txtValor.addListener(new ValidateLimit(txtValor, 250));

	}	
	
	private void habilitarEdicion(boolean flag){
		flagNuevo = !flag;
		btnEliminarParametro.setVisible(flag);
		if(flag)		
			btnGestionParametro.setCaption("Actualizar");		
		else		
			btnGestionParametro.setCaption("Crear");
	}
	
	private void limpiar(){
		txtCodigo.setValue("");
		txtNombre.setValue("");
		txtADescripcion.setValue("");
		txtValor.setValue("");
		cmbEstado.setValue(null);
	}
	
	private void cargarParametros(List<Parametro> parametros, boolean flagLimpiar){
		IndexedContainer container = new IndexedContainer();
		
		container.addContainerProperty("codigo", String.class,  null);
		container.addContainerProperty("nombre", String.class,  null);
		container.addContainerProperty("descripcion", String.class,  null);
		container.addContainerProperty("valor", String.class,  null);
		container.addContainerProperty("estado.nombre", String.class,  null);
		
		int con=1;
		for (Parametro parametro : parametros) {
			Item item = container.addItem(con++);
            item.getItemProperty("codigo").setValue(parametro.getCodigo());
            item.getItemProperty("nombre").setValue(parametro.getNombre());
            item.getItemProperty("descripcion").setValue(parametro.getDescripcion());
            item.getItemProperty("valor").setValue(parametro.getValor());
            item.getItemProperty("estado.nombre").setValue(parametro.getEstado() == null ? null :parametro.getEstado().getNombre());
		}
		
		tblParametro.setContainerDataSource(container);
		tblParametro.setVisibleColumns(new Object[]{"codigo", "nombre", "valor", "estado.nombre"});
		tblParametro.setColumnWidth("codigo", 92);
		tblParametro.setColumnWidth("nombre", 187);
		tblParametro.setColumnWidth("valor", 137);
		tblParametro.setColumnWidth("estado.nombre", 105);
		tblParametro.setColumnHeader("codigo", "Código");
		tblParametro.setColumnHeader("nombre", "Nombre");
		tblParametro.setColumnHeader("valor", "Valor");
		tblParametro.setColumnHeader("estado.nombre", "Estado");
		
		if(flagLimpiar){
			txtFiltroCodigo.setValue("");
			txtFiltroEstado.setValue("");
			txtFiltroNombre.setValue("");
			txtFiltroValor.setValue("");
		}
		
	}

	@Override
	public void textChange(TextChangeEvent event) {
		Parametro parametro = new Parametro();
		if (event.getSource().equals(txtFiltroCodigo)) {

			if (StringUtils.isNotBlank(event.getText())) {
				parametro.setCodigo(event.getText());
			}
			if (StringUtils.isNotBlank(txtFiltroNombre.getValue().toString())) {
				parametro.setNombre(txtFiltroNombre.getValue().toString());
			}
			if (StringUtils.isNotBlank(txtFiltroValor.getValue().toString())) {
				parametro.setValor(txtFiltroValor.getValue().toString());
			}
			if (StringUtils.isNotBlank(txtFiltroEstado.getValue().toString())) {
				Valor estado = new Valor();
				estado.setNombre(txtFiltroEstado.getValue().toString());
				parametro.setEstado(estado);
			}
		}
		if(event.getSource().equals(txtFiltroNombre))
		{
			if (StringUtils.isNotBlank(txtFiltroCodigo.getValue().toString())) {
				parametro.setCodigo(txtFiltroCodigo.getValue().toString());
			}
			if (StringUtils.isNotBlank(event.getText())) {
				parametro.setNombre(event.getText());
			}
			if (StringUtils.isNotBlank(txtFiltroValor.getValue().toString())) {
				parametro.setValor(txtFiltroValor.getValue().toString());
			}
			if (StringUtils.isNotBlank(txtFiltroEstado.getValue().toString())) {
				Valor estado = new Valor();
				estado.setNombre(txtFiltroEstado.getValue().toString());
				parametro.setEstado(estado);
			}
		}
		if(event.getSource().equals(txtFiltroValor))
		{
			if (StringUtils.isNotBlank(txtFiltroCodigo.getValue().toString())) {
				parametro.setCodigo(txtFiltroCodigo.getValue().toString());
			}
			if (StringUtils.isNotBlank(txtFiltroNombre.getValue().toString())) {
				parametro.setNombre(txtFiltroNombre.getValue().toString());
			}
			if (StringUtils.isNotBlank(event.getText())) {
				parametro.setValor(event.getText());
			}
			if (StringUtils.isNotBlank(txtFiltroEstado.getValue().toString())) {
				Valor estado = new Valor();
				estado.setNombre(txtFiltroEstado.getValue().toString());
				parametro.setEstado(estado);
			}
		}
		if(event.getSource().equals(txtFiltroEstado))
		{
			if(StringUtils.isNotBlank(txtFiltroCodigo.getValue().toString()))
			{
				parametro.setCodigo(txtFiltroCodigo.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroNombre.getValue().toString()))
			{
				parametro.setNombre(txtFiltroNombre.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroValor.getValue().toString()))
			{
				parametro.setValor(txtFiltroValor.getValue().toString());
			}
			if(StringUtils.isNotBlank(event.getText()))
			{
				Valor estado = new Valor();
				estado.setNombre(event.getText());
				parametro.setEstado(estado);
			}
		}
		List<Parametro> parametros = parametroService.buscar(parametro);
		cargarParametros(parametros, false);
		limpiar();
		habilitarEdicion(false);
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if (event.getButton().equals(btnGestionParametro)) {
			buttonClickGestion();
		}
		if (event.getButton().equals(btnEliminarParametro)) {
			buttonClickEliminar();
		}
	}
	
	private void buttonClickGestion(){

		Parametro parametro = new Parametro();
		parametro.setCodigo(txtCodigo.getValue().toString().trim());
		parametro.setNombre(txtNombre.getValue().toString().trim());
		parametro.setDescripcion(StringUtils.trimToEmpty(txtADescripcion.getValue() != null ? txtADescripcion.getValue().toString() : StringUtils.EMPTY));
		parametro.setValor(txtValor.getValue().toString().trim());			
		parametro.setEstado((Valor) cmbEstado.getValue());
		
		if (flagNuevo) {
			System.out.println("pinta");
			parametroService.crear(parametro);
		} else {
			System.out.println("pinta actualizar");
			parametro.setCodigoAnterior(codigo);
			parametroService.actualizar(parametro);
		}
		refrescar();
	
	}
	
	private void buttonClickEliminar(){

		parametroService.eliminarXId(txtCodigo.getValue().toString());
		refrescar();
		
	
	}
	
	private void refrescar()
	{
		habilitarEdicion(false);
		limpiar();
		List<Parametro> parametros = parametroService.buscar(null);
		cargarParametros(parametros, true);
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// pnlContenidoLayout
		pnlContenidoLayout = buildPnlContenidoLayout();
		pnlPrincipal.addComponent(pnlContenidoLayout);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlContenidoLayout() {
		// common part: create layout
		pnlContenidoLayout = new HorizontalLayout();
		pnlContenidoLayout.setImmediate(false);
		pnlContenidoLayout.setWidth("-1px");
		pnlContenidoLayout.setHeight("-1px");
		pnlContenidoLayout.setMargin(true);
		
		// pnlTablaContenido
		pnlTablaContenido = buildPnlTablaContenido();
		pnlContenidoLayout.addComponent(pnlTablaContenido);
		
		// pnlParametroContenido
		pnlParametroContenido = buildPnlParametroContenido();
		pnlContenidoLayout.addComponent(pnlParametroContenido);
		pnlContenidoLayout.setExpandRatio(pnlParametroContenido, 1.0f);
		
		return pnlContenidoLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlTablaContenido() {
		// common part: create layout
		pnlTablaContenido = new VerticalLayout();
		pnlTablaContenido.setImmediate(false);
		pnlTablaContenido.setWidth("620px");
		pnlTablaContenido.setHeight("-1px");
		pnlTablaContenido.setMargin(false);
		
		// lblFiltroBusqueda
		lblFiltroBusqueda = new Label();
		lblFiltroBusqueda.setStyleName("h2");
		lblFiltroBusqueda.setImmediate(false);
		lblFiltroBusqueda.setWidth("-1px");
		lblFiltroBusqueda.setHeight("-1px");
		lblFiltroBusqueda.setValue("Filtro de Busqueda de Parámetros");
		pnlTablaContenido.addComponent(lblFiltroBusqueda);
		
		// pnlFiltroTabla
		pnlFiltroTabla = buildPnlFiltroTabla();
		pnlTablaContenido.addComponent(pnlFiltroTabla);
		
		// pnlTabla
		pnlTabla = buildPnlTabla();
		pnlTablaContenido.addComponent(pnlTabla);
		
		return pnlTablaContenido;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlFiltroTabla() {
		// common part: create layout
		pnlFiltroTabla = new HorizontalLayout();
		pnlFiltroTabla.setImmediate(false);
		pnlFiltroTabla.setWidth("-1px");
		pnlFiltroTabla.setHeight("-1px");
		pnlFiltroTabla.setMargin(false);
		
		// txtFiltroCodigo
		txtFiltroCodigo = new TextField();
		txtFiltroCodigo.setImmediate(false);
		txtFiltroCodigo.setWidth("105px");
		txtFiltroCodigo.setHeight("-1px");
		txtFiltroCodigo.setInputPrompt("Código");
		pnlFiltroTabla.addComponent(txtFiltroCodigo);
		
		// txtFiltroNombre
		txtFiltroNombre = new TextField();
		txtFiltroNombre.setImmediate(false);
		txtFiltroNombre.setWidth("200px");
		txtFiltroNombre.setHeight("-1px");
		txtFiltroNombre.setInputPrompt("Nombre");
		pnlFiltroTabla.addComponent(txtFiltroNombre);
		
		// txtFiltroValor
		txtFiltroValor = new TextField();
		txtFiltroValor.setImmediate(false);
		txtFiltroValor.setWidth("150px");
		txtFiltroValor.setHeight("-1px");
		txtFiltroValor.setInputPrompt("Valor");
		pnlFiltroTabla.addComponent(txtFiltroValor);
		
		// txtFiltroEstado
		txtFiltroEstado = new TextField();
		txtFiltroEstado.setImmediate(false);
		txtFiltroEstado.setWidth("120px");
		txtFiltroEstado.setHeight("-1px");
		txtFiltroEstado.setInputPrompt("Estado");
		pnlFiltroTabla.addComponent(txtFiltroEstado);
		
		return pnlFiltroTabla;
	}

	@AutoGenerated
	private VerticalLayout buildPnlTabla() {
		// common part: create layout
		pnlTabla = new VerticalLayout();
		pnlTabla.setImmediate(false);
		pnlTabla.setWidth("-1px");
		pnlTabla.setHeight("-1px");
		pnlTabla.setMargin(false);
		
		// tblParametro
		tblParametro = new Table();
		tblParametro.setImmediate(false);
		tblParametro.setWidth("600px");
		tblParametro.setHeight("300px");
		pnlTabla.addComponent(tblParametro);
		
		return pnlTabla;
	}

	@AutoGenerated
	private VerticalLayout buildPnlParametroContenido() {
		// common part: create layout
		pnlParametroContenido = new VerticalLayout();
		pnlParametroContenido.setImmediate(false);
		pnlParametroContenido.setWidth("-1px");
		pnlParametroContenido.setHeight("-1px");
		pnlParametroContenido.setMargin(false);
		pnlParametroContenido.setSpacing(true);
		
		// lblParametro
		lblParametro = new Label();
		lblParametro.setStyleName("h2");
		lblParametro.setImmediate(false);
		lblParametro.setWidth("-1px");
		lblParametro.setHeight("-1px");
		lblParametro.setValue("Administración de Parámetro");
		pnlParametroContenido.addComponent(lblParametro);
		
		// txtCodigo
		txtCodigo = new TextField();
		txtCodigo.setCaption(" Código");
		txtCodigo.setImmediate(false);
		txtCodigo.setWidth("150px");
		txtCodigo.setHeight("-1px");
		txtCodigo.setRequired(true);
		txtCodigo.setInputPrompt("Código");
		pnlParametroContenido.addComponent(txtCodigo);
		
		// txtNombre
		txtNombre = new TextField();
		txtNombre.setCaption(" Nombre");
		txtNombre.setImmediate(false);
		txtNombre.setWidth("250px");
		txtNombre.setHeight("-1px");
		txtNombre.setRequired(true);
		txtNombre.setInputPrompt("Nombre del Parámetro");
		pnlParametroContenido.addComponent(txtNombre);
		
		// txtADescripcion
		txtADescripcion = new TextArea();
		txtADescripcion.setCaption(" Descripción");
		txtADescripcion.setImmediate(false);
		txtADescripcion.setWidth("255px");
		txtADescripcion.setHeight("74px");
		txtADescripcion.setRequired(true);
		txtADescripcion.setInputPrompt("Descripción breve de la propiedad");
		pnlParametroContenido.addComponent(txtADescripcion);
		
		// txtValor
		txtValor = new TextField();
		txtValor.setCaption("Valor");
		txtValor.setImmediate(false);
		txtValor.setWidth("250px");
		txtValor.setHeight("-1px");
		txtValor.setRequired(true);
		txtValor.setInputPrompt("Valor utilizado para la Configuración");
		pnlParametroContenido.addComponent(txtValor);
		
		// cmbEstado
		cmbEstado = new ComboBox();
		cmbEstado.setCaption("Estado");
		cmbEstado.setImmediate(false);
		cmbEstado.setWidth("-1px");
		cmbEstado.setHeight("-1px");
		cmbEstado.setRequired(true);
		pnlParametroContenido.addComponent(cmbEstado);
		
		// pnlBotonContenido
		pnlBotonContenido = buildPnlBotonContenido();
		pnlParametroContenido.addComponent(pnlBotonContenido);
		pnlParametroContenido.setComponentAlignment(pnlBotonContenido,
				new Alignment(20));
		
		return pnlParametroContenido;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlBotonContenido() {
		// common part: create layout
		pnlBotonContenido = new HorizontalLayout();
		pnlBotonContenido.setImmediate(false);
		pnlBotonContenido.setWidth("-1px");
		pnlBotonContenido.setHeight("-1px");
		pnlBotonContenido.setMargin(true);
		pnlBotonContenido.setSpacing(true);
		
		// btnGestionParametro
		btnGestionParametro = new Button();
		btnGestionParametro.setCaption("Crear");
		btnGestionParametro.setImmediate(true);
		btnGestionParametro.setWidth("-1px");
		btnGestionParametro.setHeight("-1px");
		pnlBotonContenido.addComponent(btnGestionParametro);
		
		// btnEliminarParametro
		btnEliminarParametro = new Button();
		btnEliminarParametro.setCaption("Eliminar");
		btnEliminarParametro.setImmediate(true);
		btnEliminarParametro.setWidth("-1px");
		btnEliminarParametro.setHeight("-1px");
		pnlBotonContenido.addComponent(btnEliminarParametro);
		
		return pnlBotonContenido;
	}

}
